package cn.laixueit.utils;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.math.BigDecimal;

/**
 * @author duxiang
 * @date 2023/12/13 16:19
 */
@Component
public class CalculateUtils<T,R> {
    /**
     * 计算成品的最终价格
     * @param r 返回的类
     * @param t 传递的类
     * @return
     */
    public R calculateNewPrice(T t,R r){
        // 获取T的属性字段，需要获取价格，折扣，是否免费，这三个字段一定是固定的
        Field moneyField = ReflectUtil.getField(t.getClass(), "money");
        Field discounFieldt = ReflectUtil.getField(t.getClass(), "discount");
        Field isPayField = ReflectUtil.getField(t.getClass(), "isPay");

        BigDecimal money = (BigDecimal) ReflectUtil.getFieldValue(t, moneyField);
        BigDecimal discount = (BigDecimal) ReflectUtil.getFieldValue(t, discounFieldt);
        Boolean isPay = (Boolean) ReflectUtil.getFieldValue(t, isPayField);
        // 计算
        BeanUtil.copyProperties(t,r);

        if (ObjectUtil.isNotEmpty(discount)) {
            BigDecimal multiply = money.multiply(discount.divide(BigDecimal.valueOf(10)));
            ReflectUtil.invoke(r,"setNewPrice",multiply.setScale(2, BigDecimal.ROUND_UP));
        } else {
            ReflectUtil.invoke(r,"setDiscount",BigDecimal.TEN);
            ReflectUtil.invoke(r,"setNewPrice",money);
        }
        if (isPay) {
            ReflectUtil.invoke(r,"setNewPrice",BigDecimal.ZERO);
        }
        // 返回 R
        // 获取 R的所有属性,将T的属性全部复制给R
        // 并将 计算的最终优惠赋值给R的最新价格
        return r;
    }
}
